/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.vng.zing.survey.controller;

import com.vng.zing.survey.memcached.SurveyCache;
import com.vng.zing.survey.thrift.client.SurveyClient;
import com.vng.zing.survey.thrift.model.SurveyItem;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.vng.zing.survey.model.CommonModel;
import com.vng.zing.survey.thrift.model.Error;
import com.vng.zing.survey.thrift.model.QuesType;
import com.vng.zing.survey.thrift.model.Question;
import com.vng.zing.survey.thrift.model.UserType;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import java.util.Map;
import org.apache.log4j.Logger;

/**
 * loi
 *
 * @author namhh
 */
public class AjaxUpdateSurvey extends BaseController {

    private static UserType userType = UserType.ADMIN;

    @Override
    public String render(HttpServletRequest request, HttpServletResponse resp) throws IOException, Exception {

        String error = "";
        try {
            Map map = checkMember(request, userType);
            if (map.containsValue(ErrorType.FAIL) || map.containsValue(ErrorType.ERROR_SYSTEM)) {
                return CommonModel.toJSON("ERROR", (String) map.get("msg"));
            }
            int idUser = (int) map.get("idUser");
            int idSurvey = Integer.parseInt(request.getParameter("idSurvey"));
            boolean isAdmin = (boolean) map.get("admin");
            if (!isAdmin) {
                return CommonModel.toJSON("ERROR", "Bạn không phải là admin!");

            }
            SurveyItem oldSurveyItem = SurveyClient.getInstance().getSurvey(idSurvey).getSurveyItem();
            if (idUser != oldSurveyItem.getIDUser()) {
                return CommonModel.toJSON("ERROR", "Bạn không phải là admin!");
            }

            String myJsonData = request.getParameter("survey");
            JSONParser parser = new JSONParser();
            Object obj = parser.parse(myJsonData);
            JSONObject jsonObject = (JSONObject) obj;

            String title = (String) jsonObject.get("title");
            if (title == null || "".equals(title)) {
                error += "Hãy nhập tên khảo sát!</br>";
            } else {
                if (title.length() > 200) {
                    error += "Tên khảo sát quá dài!</br>";
                }
            }
            String description = (String) jsonObject.get("description");
            if (description == null) {
                error += "Hãy nhập mô tả khảo sát!</br>";
            } else {
                if (description.length() > 500) {
                    error += "Mô tả quá dài!</br>";
                }
            }

            Long beginDay = (Long) jsonObject.get("beginDay");
            if (beginDay == null) {
                error += "Ngày bắt đầu không hợp lệ!</br>";
            }
            Long endDay = (Long) jsonObject.get("endDay");
            if (endDay <= 0 || endDay < beginDay) {
                error += "Ngày kết thúc không hợp lệ!</br>";
            }
            String str_point = (String) jsonObject.get("point");
            short point = 0;

            if (str_point == null || "".equals(str_point)) {
                error += "Hãy nhập điểm thưởng!</br>";
            } else {
                point = Short.parseShort(str_point);
                if (point < 0 || point > 1000) {
                    error += "Điểm thưởng không hợp lệ!</br>";
                }
            }

            boolean share = (Boolean) jsonObject.get("share");

            List<Question> questions = new ArrayList<Question>();

            // loop array
            JSONArray msg = (JSONArray) jsonObject.get("questions");
            for (Object object : msg) {

                JSONObject jsonQuestion = (JSONObject) object;
                Long idQues = (Long) jsonQuestion.get("idQues");
                if (idQues < 0) {
                    error += "Mã câu hỏi không hơp lệ!</br>";
                }

                String titleQues = (String) jsonQuestion.get("titleQues");
                if (titleQues == null || "".equals(titleQues)) {
                    error += "Hãy nhập nội dung câu hỏi!</br>";
                } else {
                    if (titleQues.length() > 200) {
                        error += "Câu hỏi quá dài!</br>";
                    }
                }

                String helpText = (String) jsonQuestion.get("helpText");
                if (helpText == null) {
                    error += "Hãy nhập mô tả câu hỏi!</br>";
                } else {
                    if (helpText.length() > 500) {
                        error += "Mô tả quá dài!</br>";
                    }
                }

                String str_require = (String) jsonQuestion.get("require");
                boolean require = Boolean.parseBoolean(str_require);

                String type = (String) jsonQuestion.get("type");
                if (!type.equals(QuesType.SINGLE_SELECTION.name()) && !type.equals(QuesType.MULTI_CHOICE.name()) && !type.equals(QuesType.MULTI_LINE.name()) && !type.equals(QuesType.SINGLE_LINE.name())) {
                    error += "Kiểu câu hỏi không hơp lệ!</br>";
                }
                List<String> choices = new ArrayList<String>();
                if (type.equals(QuesType.SINGLE_SELECTION.name()) || type.equals(QuesType.MULTI_CHOICE.name())) {
                    JSONArray JSONChoices = (JSONArray) jsonQuestion.get("choices");
                    if (JSONChoices == null) {
                        error += "Hãy thêm các lựa chọn!</br>";
                    } else {
                        Iterator<String> iterator = JSONChoices.iterator();
                        while (iterator.hasNext()) {
                            choices.add(iterator.next());
                        }
                    }
                }

                Question question = new Question(idQues.shortValue(), titleQues, helpText, require, QuesType.valueOf(type), choices);
                questions.add(question);
            }
            if (questions.size() <= 0) {
                error += "Không có câu hỏi nào!</br>";
            }
            if ("".equals(error)) {
                oldSurveyItem.setTitle(title);
                oldSurveyItem.setDescription(description);
                oldSurveyItem.setBeginDay(beginDay.intValue());
                oldSurveyItem.setEndDay(endDay.intValue());
                oldSurveyItem.setPoint(point);
                oldSurveyItem.setOption(share);
                oldSurveyItem.setQuestions(questions);
                System.out.println("survey update" + oldSurveyItem);
                Error e = SurveyCache.updateSurveyWithCache(idSurvey, oldSurveyItem);

                return CommonModel.toJSON(e.name(), "Bạn đã chỉnh sữa thành công!");

            } else {

                return CommonModel.toJSON("ERROR", error);

            }
        } catch (Exception ex) {
            Logger.getLogger(this.getName()).error(ex.toString());
            return CommonModel.toJSON("ERROR", "Vui lòng thử lại sau!");

        }

    }

}
